Libraries used in the Project and uploading data
library(tidyverse)
library(dplyr)
library(stringr)
library(svMisc)
library(ggplot2)
library(gtable)
library("ggpubr")
log_data <- read_csv("~/Desktop/PAE/github/data/logData.csv")
log_data_saver <- log_data
log_data <- unique(log_data)
log_data$logInfo <- str_replace(log_data$logInfo, " ", " ")
view(log_data)
#MAKE IT ALL UPPER!!!
log_data$logInfo <- toupper(log_data$logInfo)
### GETTING THE DATE MONTH AND YEAR IF I WANT!!!
extractdate <- function(date) {
day <- format(date, format="%d")
month <- format(date, format="%m")
year <- format(date, format="%Y")
cbind(day, month, year)
}
#making first calls
first_call<-extractdate(log_data$callTime)
#making last call
last_day <-substr(log_data$lastCallTime, 9, 10)
last_month <- substr(log_data$lastCallTime, 6, 7)
last_year <-substr(log_data$lastCallTime, 1, 4)
log_data<-cbind(log_data, first_call,last_day,last_month,last_year)
#Converting columns to numeric
log_data$day <-as.numeric(log_data$day)
log_data$last_day <- as.numeric(log_data$last_day)
log_data$month <-as.numeric(log_data$month)
log_data$last_month <- as.numeric(log_data$last_month)
log_data$year <- as.numeric(log_data$year)
log_data$last_year <- as.numeric(log_data$last_year )
log_data$year <- log_data$year +log_data$month/12
log_data$last_year <- log_data$last_year + log_data$last_month/12
log_data$caller_lifetime <- log_data$last_year - log_data$year
Cmd+Option+I.
Cmd+Shift+K
PRELIMINARY DISTRIBUTIONS
In this section, we display some of the basic distributions of the data including languages, total lifeetime of a given caller, colls made, content accessed, and the ratio of content listened to calls made.
Based on the graphs below, we are nervous that some of the data is not random given the incredibly high ratio for content listened to calls made, but given that the data is distributed fairly evenly across thee different graphs, we are unsure
lang_spoken <- log_data %>%
group_by(callerId, langId) %>%
count()
#Distribution of languages spoken
ggplot(data=lang_spoken, aes(x=langId)) +
geom_bar()+
labs(
title = 'Distribution of Languages
1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna',
x = 'Language',
y= 'count'
)

#Distribution of time difference bewtween first and last call
lifetime<- log_data %>%
group_by(callerId, caller_lifetime) %>%
count()
ggplot(data=lifetime, aes(x=caller_lifetime)) +
geom_histogram(fill='brown', color='black')+
labs(
title = 'Distribution of Call Lifetimes',
x = 'Years between First and Last Call',
y= 'count'
)

#distribution of calls made
calls_made <- log_data %>%
group_by(callerId, noCallsMade) %>%
count()
ggplot(calls_made, aes(x=noCallsMade)) +
geom_histogram(color="black", fill="blue") +
xlim(0,350) +
labs(
title = 'Distribution of calls made per individual (Outliers Excluded) \n
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.0 45.0 69.0 99.9 106.0 7110.0 ',
x = 'Total number of calls'
)

content_listened <- filter(log_data, grepl("CONTENT",logInfo))
content_listened <- filter(content_listened , !grepl("CONTENT MENU",logInfo))
content_listened <- filter(content_listened , !grepl("CONTENT IS NOT AVAILABLE",logInfo))
#Creating a content#_played column
content_listened$content_played <- ifelse(str_detect(content_listened$logInfo, 'CONTENT PLAYED', negate = FALSE),1,0)
content_listened$replay_request <- ifelse(str_detect(content_listened$logInfo, 'CONTENT REPLAY REQUESTED', negate = FALSE),1,0)
content_played<-aggregate(content_listened$content_played,list(content_listened$callerId), FUN=sum)
?rename
content_played <- content_played %>%
dplyr::rename(
con_play = x,
callerId = Group.1
)
content_replay<-aggregate(content_listened$replay_request,list(content_listened$callerId), FUN=sum)
content_replay <- content_replay %>%
dplyr::rename(
con_replay = x,
callerId = Group.1
)
content_counts <- cbind(content_played, content_replay)
content_counts$adjusted_con <- content_counts$con_play-content_counts$con_replay
content_counts$callerId <- NULL
summary(content_counts$adjusted_con)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 3.00 8.00 17.79 20.00 279.00
#graphing the true distribution of content played
ggplot(content_counts, aes(x=adjusted_con)) +
geom_histogram(color="black", fill="green") +
xlim(0,100) +
labs(
title = 'Distribution of total Content listened to all Across all Calls (Outliers Excluded) \n
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 3.00 8.00 17.79 20.00 279.00 ',
x = 'Total Content Listen Across Calls'
)

# Getting the number of calls per person
calls_made <- log_data %>%
dplyr::group_by(callerId, noCallsMade, langId) %>%
count()
#join between tables
content_ratio <- left_join(calls_made, content_counts,by="callerId")
content_ratio[is.na(content_ratio)] <- 0
content_ratio$ratio <- content_ratio$adjusted_con/content_ratio$noCallsMade
summary(content_ratio$ratio)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00000 0.02305 0.08475 0.32163 0.25878 22.33333
ggplot(content_ratio, aes(x=ratio)) +
geom_histogram(color="black", fill="red") +
xlim(0, 1) +
labs(
title = 'Distribution of ratio of content listened to Calls (Outliers Excluded) \n
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00000 0.02305 0.08475 0.32163 0.25878 22.33333 ',
x = 'Content to Call Ratio'
)

NA
NA
RAIN MENU/PRE PLANTING MENU/LAND PREPARATION
We continue our pattern of following the most accessed submenu from the previous subment - land preparation! This is also the bottom of a tree. We will breakdown conent selection by language and overall
INCOMING CALL STARTED –> WELCOME MESSAGE PLAYED –> RANDOM EXPERIMENT –>
TOP MENU –> RAIN MENU –> PRE PLANTING MENU –> LAND PREPARATION
LAND PREPARATION
- BARLEY
- MAIZE
- SORGHUM
- TEF
- WHEAT
- SESAME
- FAVA BEAN
- CHICKPEA
- COMMON BEAN
- COTTON
ORDER UNKOWN:
- RICE
- DURAME WHEAT
- LENTIL
- MALT BARLEY
#GETTING THE CROP MENU FROM MENU 1 (rain/preplanting/land preparation sub menu)
land_prep <- filter(log_data, grepl("CONTENT PLAYED - LAND PREPARATION - ",logInfo))
land_prep_final <- land_prep %>%
group_by(callerId, logInfo, langId) %>%
count()
land_prep_final$logInfo<- str_replace(land_prep_final$logInfo, "CONTENT PLAYED - LAND PREPARATION -", "")
ggplot(data=land_prep_final, aes(x=logInfo)) +
theme(axis.text.x = element_text(angle = 45, hjust=2))+
geom_bar()+
labs(
title = 'RAIN MENU/PRE PLANTING/LAND PREPARATION
content actually played by language',
x = 'Content Played',
y= 'count'
)

#get rid of the language breakdown
land_prep_no_lang <- land_prep_final
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- AMHARIC", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- OROMIFFA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- TIGRIGNA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- WOLAYITTA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- WOLAYTIGNA", "")
land_prep_no_lang$logInfo<- str_replace(land_prep_no_lang$logInfo, "- SIDAMIGNA", "")
ggplot(land_prep_no_lang, aes(x=logInfo)) +
theme(axis.text.x = element_text(angle = 90))+
geom_bar()+
labs(
title = 'RAIN MENU/PRE PLANTING/LAND PREPARATION
content played overall',
x = 'Content Played',
y= 'count'
)

ggplot(land_prep_no_lang, aes(langId, fill = logInfo)) +
geom_bar()+
labs(
title = 'ALTERNATIVE RAIN MENU/PRE PLANTING/LAND PREPARATION
content actually played by language
1 = Amharic, 2=Oromiffa, 3=Tigrigna, 4=Wolayitta, and 5=Sidamigna
',
x = 'Language'
)

BIG TAKEAWAY: 35% of users end up accessing the maize menu at some point! Wheat, Tef, Sorghum, and Barley also appear to be qualitatively significant
There is no menu to go deeper in, so let’s go back up a level and check to see if other branches have a lot of access
LS0tCnRpdGxlOiAiUEFELUFUQSBDYWxsIExvZyBBbmFseXNpcyIKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMjIyBMaWJyYXJpZXMgdXNlZCBpbiB0aGUgUHJvamVjdCBhbmQgdXBsb2FkaW5nIGRhdGEKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHN2TWlzYykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGd0YWJsZSkKbGlicmFyeSgiZ2dwdWJyIikKCmxvZ19kYXRhIDwtIHJlYWRfY3N2KCJ+L0Rlc2t0b3AvUEFFL2dpdGh1Yi9kYXRhL2xvZ0RhdGEuY3N2IikKCmxvZ19kYXRhX3NhdmVyIDwtIGxvZ19kYXRhCgpsb2dfZGF0YSA8LSB1bmlxdWUobG9nX2RhdGEpCgpsb2dfZGF0YSRsb2dJbmZvIDwtIHN0cl9yZXBsYWNlKGxvZ19kYXRhJGxvZ0luZm8sICIgICIsICIgIikKCnZpZXcobG9nX2RhdGEpCiNNQUtFIElUIEFMTCBVUFBFUiEhIQoKbG9nX2RhdGEkbG9nSW5mbyA8LSB0b3VwcGVyKGxvZ19kYXRhJGxvZ0luZm8pCgojIyMgR0VUVElORyBUSEUgREFURSBNT05USCBBTkQgWUVBUiBJRiBJIFdBTlQhISEKZXh0cmFjdGRhdGUgPC0gZnVuY3Rpb24oZGF0ZSkgewogICAgZGF5IDwtIGZvcm1hdChkYXRlLCBmb3JtYXQ9IiVkIikKICAgIG1vbnRoIDwtIGZvcm1hdChkYXRlLCBmb3JtYXQ9IiVtIikKICAgIHllYXIgPC0gZm9ybWF0KGRhdGUsIGZvcm1hdD0iJVkiKQoKICAgIGNiaW5kKGRheSwgbW9udGgsIHllYXIpCn0KCiNtYWtpbmcgZmlyc3QgY2FsbHMKZmlyc3RfY2FsbDwtZXh0cmFjdGRhdGUobG9nX2RhdGEkY2FsbFRpbWUpCgoKI21ha2luZyBsYXN0IGNhbGwKbGFzdF9kYXkgPC1zdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCA5LCAxMCkKbGFzdF9tb250aCA8LSBzdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCA2LCA3KQpsYXN0X3llYXIgPC1zdWJzdHIobG9nX2RhdGEkbGFzdENhbGxUaW1lLCAxLCA0KQoKbG9nX2RhdGE8LWNiaW5kKGxvZ19kYXRhLCBmaXJzdF9jYWxsLGxhc3RfZGF5LGxhc3RfbW9udGgsbGFzdF95ZWFyKQoKI0NvbnZlcnRpbmcgY29sdW1ucyB0byBudW1lcmljCmxvZ19kYXRhJGRheSA8LWFzLm51bWVyaWMobG9nX2RhdGEkZGF5KQpsb2dfZGF0YSRsYXN0X2RheSA8LSBhcy5udW1lcmljKGxvZ19kYXRhJGxhc3RfZGF5KQpsb2dfZGF0YSRtb250aCA8LWFzLm51bWVyaWMobG9nX2RhdGEkbW9udGgpCmxvZ19kYXRhJGxhc3RfbW9udGggPC0gYXMubnVtZXJpYyhsb2dfZGF0YSRsYXN0X21vbnRoKQpsb2dfZGF0YSR5ZWFyIDwtIGFzLm51bWVyaWMobG9nX2RhdGEkeWVhcikKbG9nX2RhdGEkbGFzdF95ZWFyIDwtIGFzLm51bWVyaWMobG9nX2RhdGEkbGFzdF95ZWFyICkKCgpsb2dfZGF0YSR5ZWFyIDwtIGxvZ19kYXRhJHllYXIgK2xvZ19kYXRhJG1vbnRoLzEyCmxvZ19kYXRhJGxhc3RfeWVhciA8LSBsb2dfZGF0YSRsYXN0X3llYXIgKyBsb2dfZGF0YSRsYXN0X21vbnRoLzEyCgpsb2dfZGF0YSRjYWxsZXJfbGlmZXRpbWUgPC0gbG9nX2RhdGEkbGFzdF95ZWFyIC0gbG9nX2RhdGEkeWVhcgpgYGAKCipDbWQrT3B0aW9uK0kqLgoKICpDbWQrU2hpZnQrSyogCiAKIyMjIFBSRUxJTUlOQVJZIERJU1RSSUJVVElPTlMKIAoqKkluIHRoaXMgc2VjdGlvbiwgd2UgZGlzcGxheSBzb21lIG9mIHRoZSBiYXNpYyBkaXN0cmlidXRpb25zIG9mIHRoZSBkYXRhIGluY2x1ZGluZyBsYW5ndWFnZXMsIHRvdGFsIGxpZmVldGltZSBvZiBhIGdpdmVuIGNhbGxlciwgY29sbHMgbWFkZSwgY29udGVudCBhY2Nlc3NlZCwgYW5kIHRoZSByYXRpbyBvZiBjb250ZW50IGxpc3RlbmVkIHRvIGNhbGxzIG1hZGUuKioKCioqQmFzZWQgb24gdGhlIGdyYXBocyBiZWxvdywgd2UgYXJlIG5lcnZvdXMgdGhhdCBzb21lIG9mIHRoZSBkYXRhIGlzIG5vdCByYW5kb20gZ2l2ZW4gdGhlIGluY3JlZGlibHkgaGlnaCByYXRpbyBmb3IgY29udGVudCBsaXN0ZW5lZCB0byBjYWxscyBtYWRlLCBidXQgZ2l2ZW4gdGhhdCB0aGUgZGF0YSBpcyBkaXN0cmlidXRlZCBmYWlybHkgZXZlbmx5IGFjcm9zcyB0aGVlIGRpZmZlcmVudCBncmFwaHMsIHdlIGFyZSB1bnN1cmUqKgoKYGBge3J9Cmxhbmdfc3Bva2VuIDwtIGxvZ19kYXRhICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCiNEaXN0cmlidXRpb24gb2YgbGFuZ3VhZ2VzIHNwb2tlbgpnZ3Bsb3QoZGF0YT1sYW5nX3Nwb2tlbiwgYWVzKHg9bGFuZ0lkKSkgKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBMYW5ndWFnZXMKICAgIDEgPSBBbWhhcmljLCAyPU9yb21pZmZhLCAzPVRpZ3JpZ25hLCA0PVdvbGF5aXR0YSwgYW5kIDU9U2lkYW1pZ25hJywKICAgIHggPSAnTGFuZ3VhZ2UnLAogICAgeT0gJ2NvdW50JwogICkKCgojRGlzdHJpYnV0aW9uIG9mIHRpbWUgZGlmZmVyZW5jZSBiZXd0d2VlbiBmaXJzdCBhbmQgbGFzdCBjYWxsCgpsaWZldGltZTwtIGxvZ19kYXRhICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBjYWxsZXJfbGlmZXRpbWUpICU+JQogIGNvdW50KCkKCmdncGxvdChkYXRhPWxpZmV0aW1lLCBhZXMoeD1jYWxsZXJfbGlmZXRpbWUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbD0nYnJvd24nLCBjb2xvcj0nYmxhY2snKSsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIENhbGwgTGlmZXRpbWVzJywKICAgIHggPSAnWWVhcnMgYmV0d2VlbiBGaXJzdCBhbmQgTGFzdCBDYWxsJywKICAgIHk9ICdjb3VudCcKICApCgojZGlzdHJpYnV0aW9uIG9mIGNhbGxzIG1hZGUKCmNhbGxzX21hZGUgPC0gbG9nX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIG5vQ2FsbHNNYWRlKSAlPiUKICBjb3VudCgpCgpnZ3Bsb3QoY2FsbHNfbWFkZSwgYWVzKHg9bm9DYWxsc01hZGUpKSArCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD0iYmx1ZSIpICsKICB4bGltKDAsMzUwKSArCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBjYWxscyBtYWRlIHBlciBpbmRpdmlkdWFsIChPdXRsaWVycyBFeGNsdWRlZCkgXG4KTWluLiAxc3QgUXUuICBNZWRpYW4gIE1lYW4gICAzcmQgUXUuICAgIE1heC4gCiAgICAzLjAgICAgNDUuMCAgICA2OS4wICAgICA5OS45ICAgIDEwNi4wICAgIDcxMTAuMCAnLAogICAgeCA9ICdUb3RhbCBudW1iZXIgb2YgY2FsbHMnCiAgKQoKY29udGVudF9saXN0ZW5lZCA8LSBmaWx0ZXIobG9nX2RhdGEsIGdyZXBsKCJDT05URU5UIixsb2dJbmZvKSkKY29udGVudF9saXN0ZW5lZCA8LSBmaWx0ZXIoY29udGVudF9saXN0ZW5lZCAsICFncmVwbCgiQ09OVEVOVCBNRU5VIixsb2dJbmZvKSkKY29udGVudF9saXN0ZW5lZCA8LSBmaWx0ZXIoY29udGVudF9saXN0ZW5lZCAsICFncmVwbCgiQ09OVEVOVCBJUyBOT1QgQVZBSUxBQkxFIixsb2dJbmZvKSkKCiNDcmVhdGluZyBhIGNvbnRlbnQjX3BsYXllZCBjb2x1bW4KY29udGVudF9saXN0ZW5lZCRjb250ZW50X3BsYXllZCA8LSBpZmVsc2Uoc3RyX2RldGVjdChjb250ZW50X2xpc3RlbmVkJGxvZ0luZm8sICdDT05URU5UIFBMQVlFRCcsIG5lZ2F0ZSA9IEZBTFNFKSwxLDApCmNvbnRlbnRfbGlzdGVuZWQkcmVwbGF5X3JlcXVlc3QgPC0gaWZlbHNlKHN0cl9kZXRlY3QoY29udGVudF9saXN0ZW5lZCRsb2dJbmZvLCAnQ09OVEVOVCBSRVBMQVkgUkVRVUVTVEVEJywgbmVnYXRlID0gRkFMU0UpLDEsMCkKCmNvbnRlbnRfcGxheWVkPC1hZ2dyZWdhdGUoY29udGVudF9saXN0ZW5lZCRjb250ZW50X3BsYXllZCxsaXN0KGNvbnRlbnRfbGlzdGVuZWQkY2FsbGVySWQpLCBGVU49c3VtKQo/cmVuYW1lCmNvbnRlbnRfcGxheWVkIDwtIGNvbnRlbnRfcGxheWVkICU+JSAKICBkcGx5cjo6cmVuYW1lKAogICAgY29uX3BsYXkgPSB4LAogICAgY2FsbGVySWQgPSBHcm91cC4xCiAgICApCgpjb250ZW50X3JlcGxheTwtYWdncmVnYXRlKGNvbnRlbnRfbGlzdGVuZWQkcmVwbGF5X3JlcXVlc3QsbGlzdChjb250ZW50X2xpc3RlbmVkJGNhbGxlcklkKSwgRlVOPXN1bSkKY29udGVudF9yZXBsYXkgPC0gY29udGVudF9yZXBsYXkgJT4lIAogZHBseXI6OnJlbmFtZSgKICAgIGNvbl9yZXBsYXkgPSB4LAogICAgY2FsbGVySWQgPSBHcm91cC4xCiAgICApCgpjb250ZW50X2NvdW50cyA8LSBjYmluZChjb250ZW50X3BsYXllZCwgY29udGVudF9yZXBsYXkpCgpjb250ZW50X2NvdW50cyRhZGp1c3RlZF9jb24gPC0gY29udGVudF9jb3VudHMkY29uX3BsYXktY29udGVudF9jb3VudHMkY29uX3JlcGxheQoKY29udGVudF9jb3VudHMkY2FsbGVySWQgPC0gTlVMTAoKc3VtbWFyeShjb250ZW50X2NvdW50cyRhZGp1c3RlZF9jb24pCgoKI2dyYXBoaW5nIHRoZSB0cnVlIGRpc3RyaWJ1dGlvbiBvZiBjb250ZW50IHBsYXllZApnZ3Bsb3QoY29udGVudF9jb3VudHMsIGFlcyh4PWFkanVzdGVkX2NvbikpICsKICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPSJncmVlbiIpICsKICB4bGltKDAsMTAwKSArCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiB0b3RhbCBDb250ZW50IGxpc3RlbmVkIHRvIGFsbCBBY3Jvc3MgYWxsIENhbGxzIChPdXRsaWVycyBFeGNsdWRlZCkgXG4KICAgICAgTWluLiAxc3QgUXUuICBNZWRpYW4gICAgTWVhbiAzcmQgUXUuICAgIE1heC4gCiAgIDAuMDAgICAgMy4wMCAgICA4LjAwICAgMTcuNzkgICAyMC4wMCAgMjc5LjAwICcsCiAgICB4ID0gJ1RvdGFsIENvbnRlbnQgTGlzdGVuIEFjcm9zcyBDYWxscycKICApCgoKIyBHZXR0aW5nIHRoZSBudW1iZXIgb2YgY2FsbHMgcGVyIHBlcnNvbgpjYWxsc19tYWRlIDwtIGxvZ19kYXRhICU+JQogIGRwbHlyOjpncm91cF9ieShjYWxsZXJJZCwgbm9DYWxsc01hZGUsIGxhbmdJZCkgJT4lCiAgY291bnQoKQoKCiNqb2luIGJldHdlZW4gdGFibGVzCmNvbnRlbnRfcmF0aW8gPC0gbGVmdF9qb2luKGNhbGxzX21hZGUsIGNvbnRlbnRfY291bnRzLGJ5PSJjYWxsZXJJZCIpCmNvbnRlbnRfcmF0aW9baXMubmEoY29udGVudF9yYXRpbyldIDwtIDAKCmNvbnRlbnRfcmF0aW8kcmF0aW8gPC0gY29udGVudF9yYXRpbyRhZGp1c3RlZF9jb24vY29udGVudF9yYXRpbyRub0NhbGxzTWFkZQoKc3VtbWFyeShjb250ZW50X3JhdGlvJHJhdGlvKQoKZ2dwbG90KGNvbnRlbnRfcmF0aW8sIGFlcyh4PXJhdGlvKSkgKwogIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9InJlZCIpICsKICB4bGltKDAsIDEpICsKICBsYWJzKAogICAgdGl0bGUgPSAnRGlzdHJpYnV0aW9uIG9mIHJhdGlvIG9mIGNvbnRlbnQgbGlzdGVuZWQgdG8gQ2FsbHMgKE91dGxpZXJzIEV4Y2x1ZGVkKSBcbgogTWluLiAgMXN0IFF1LiAgIE1lZGlhbiAgICAgTWVhbiAgM3JkIFF1LiAgICAgTWF4LiAKIDAuMDAwMDAgIDAuMDIzMDUgIDAuMDg0NzUgIDAuMzIxNjMgIDAuMjU4NzggMjIuMzMzMzMgJywKICAgIHggPSAnQ29udGVudCB0byBDYWxsIFJhdGlvJwogICkKCgpgYGAKCiMjIyBUT1AgTUVOVQoKKipOZXh0LCB3ZSB3YW50IHRvIEJyZWFrZCBkb3duIHRoZSBpbml0aWFsIE1lbnUgb3B0aW9ucyBhbmQgZGVsdmUgaW50byB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgc2VsZWN0aW9ucyB0aGF0IHRoZSBmYXJtZXIgY2FuIG1ha2UgYXQgYSBkaWZmZXJlbnQgc3RhdGUgaW4gdGhlIElWUiBTeXN0ZW0qKgoKKipGb3IgdGhlIGZpcnN0IGFuYWx5c2lzLCB3ZSBsb29rZWQgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgVE9QIE1FTlUgaW4gdGhlIGRhdGEuIFRoaXMgY29tZXMgaW4gYXMgZm9sbG93cyoqOgoKIyMjIyMgSU5DT01JTkcgQ0FMTCBTVEFSVEVEIC0tPiBXRUxDT01FIE1FU1NBR0UgUExBWUVEIC0tPiBBU1NJTkdFRCBUTyBFWFBFUklNRU5UIChPUFRJT05BTCkgLS0+IFRPUCBNRU5VCgoqKlRPUCBNRU5VKioKCiAtIFJBSU4gT1BUSU9OCiAtIEhISSBPUFRJT04gKGhvdXNlaG9sZCBJcnJpZ2F0aW9uKQogLSBSRVNFVCBQUk9GSUxFIE9QVElPTgogLSBUT1AgTUVOVSBSRVBMQVkKIC0gTElWRVNUT0NLIE9QVElPTiAKIC0gQ09WSUQgT1BUSU9OCiAKICpQbGVhc2Ugbm90ZSwgd2UgYXJlIHVuc3VyZSBvZiB0aGUgb3JkZXIgdGhlc2UgYXJlIHByZXNlbnRlZC4gRm9yIG90aGVyIG1lbnVzLCB3ZSBkbyBoYXZlIHRoZSBvcmRlcioKIAogKipCZWxvdywgd2UgaGF2ZSB2aXN1YWxpemVkIHRoZSBudW1iZXIgb2YgZmFybWVycywgb3V0IG9mIG91ciBzYW1wbGUsIHRoYXQgaW4gdGhlIGxpZmUgdGltZSBvZiB0aGVpciBjYWxsaW5nIGhpc3RvcnkgaGF2ZSBhY2Nlc3NlZCBhIGdpdmVuIFRPUCBNRU5VIGl0ZW0gYXQgbGVhc3Qgb25jZSoqCiAKICoqQWRkaXRpb25hbGx5LCB3ZSBhbHNvIHZpc3VhbGl6ZWQgdGhpcyBzYW1lIHNlbGVjdGlvbiBkaXZpZGVkIGJ5IGxhbmd1YWdlIHRvIHNlZSBpZiB0aGUgcGF0dGVybnMgb2Ygc2VsZWNpb250IGFyZSBzaW1pbGFyIG9yIGRpZmZlcmVudCBhY3Jvc3MgbGFuZ2F1Z2VzKip2CiAKYGBge3J9CiMgZmlsdGVyaW5nIG91dCB0b3AgTWVudSBrZXlzCgp0b3BfbWVudSA8LWZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIlRPUCBNRU5VIixsb2dJbmZvKSkKCiNjbGVhbmluZyB0aGUgYXhpcwp0b3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UodG9wX21lbnUkbG9nSW5mbywgIlRPUCBNRU5VIC0gIiwgIiIpCnRvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZSh0b3BfbWVudSRsb2dJbmZvLCAiIFBSRVNTRUQiLCAiIikKdG9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHRvcF9tZW51JGxvZ0luZm8sICIgUFJFU1NFRCIsICIiKQp0b3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UodG9wX21lbnUkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQoKdG9wX21lbnUgPC0gdG9wX21lbnUgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIGxvZ0luZm8sIGxhbmdJZCkgJT4lCiAgY291bnQoKQoKCmdncGxvdCh0b3BfbWVudSwgYWVzKGxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPTEpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdEaXN0aXJ1dGlvbiBvZiBUT1AgTUVOVSBpdGVtcyBzZWxlY3RlZCBhdCBsZWFzdCBvbmNlIGJ5IGEgdW5pcXVlIGNhbGxlcicsCiAgICB4ID0gJ1RPUCBNRU5VIG9wdGlvbnMnCiAgKQoKZ2dwbG90KHRvcF9tZW51LCBhZXMobGFuZ0lkLCBmaWxsID0gbG9nSW5mbykpICsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdEaXN0aXJ1dGlvbiBvZiBMYW5ndWFnZXMgZGl2aWRlZCBieSBUT1AgTUVOVSBvcHRpb24KICAgIDEgPSBBbWhhcmljLCAyPU9yb21pZmZhLCAzPVRpZ3JpZ25hLCA0PVdvbGF5aXR0YSwgYW5kIDU9U2lkYW1pZ25hJywKICAgIHggPSAnTGFuZ3VhZ2UnCiAgKQoKCmBgYAogCiAKIAoqKkFzIHdlIGNhbiBlYXNpbHkgc2VlLCB0aGUgUkFJTiBvcHRpb25zIGFuZCB0aGUgSEhJIG9wdGlvbiBkb21pbmF0ZSB0aGUgY2hvaWNlcyBmcm9tIHRoZSB0b3AgTWVudS4gU28sIHdlIGRlY2lkZWQgdG8gZGl2ZSBkZWVwZXIgaW50byBlYWNoIG9mIHRoZXNlIG1lbnVzIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IG91dGxpZXIgc2VsZWN0aW9ucyB0aGF0IGFyZSBkZWVwIHdpdGhpbiB0aGUgc3lzdGVtLiBBZGRpdGlvbmFsbHksIHRocyBkaXN0cmlidXRpb24gYWNyb3NzIGxhbmd1YWdlcyBzZWVtcyB0byBiZSBmYWlybHkgY29uc2lzdGVudCBhdCBmYWNlIHZhbHVlLiBXZSBjYW4gcnVuIHRlc3RzIGluIHRoZSBmdXR1cmUsIGJ1dCBmb3IgRURBIHRoaXMgd2lsbCBiZSBhZGVxdWF0ZS4gRm9yIDMvNCBsYW5nYXVnZSBvcHRpb25zIC0gaGF2aW5nIG1vcmUgZGF0YSB3b3VsZCBiZSBhcHByZWNhaXRlZCoqCgoKIyMjIFJBSU4gTUVOVQoKIyMjIyMgSU5DT01JTkcgQ0FMTCBTVEFSVEVEIC0tPiBXRUxDT01FIE1FU1NBR0UgUExBWUVEIC0tPiBSQU5ET00gRVhQRVJJTUVOVCAtLT4gVE9QIE1FTlUgLS0+IFJBSU4gTUVOVQoKKipIZXJlLCB3ZSBsb29rIGF0IHRoZSBicmVha2Rvd24gb2YgaW5kaXZpZHVhbHMgd2hvIGhhdmUgc2VsZWN0ZWQgYSBnaXZlbiBvcHRpb24gaW4gdGhlIHJhaW4gbWVudSBhdCBsZWFzdCBvbmNlLiBJbiB0aGUgZGF0YSwgTUFJTiBNRU5VID09IFJBSU4gTUVOVS4qKgoKCioqUkFJTiBNRU5VKioKCiAtIFBSRSBQTEFOVElORyBPUFRJT04KIC0gUExBTlRJTkcgT1BUSU9OCiAtIENST1AgUFJPVEVDVElPTiBPUFRJT04KIC0gRkVSVElMSVpHRVIgU0lERSBEUkVFU1NJTkcKIC0gUE9TVCBIQVJWRVNUIEFORCBQUk9DRVNTSU5HCiAtIFJFUEVBVCBSQUlOIE1FTlUKIC0gUkVUVVJOIFRPIFRPUCBNRU5VCiAtIElOVkFMSUQgS0VZIFBSRVNTRUQgKEFERElUSU9OQUwgT1VUQ09NRSkKCgoKYGBge3J9CiMgUHVsbGluZyBvdXQgdGhlIHJhaW4gTWVudQoKI1JBSU4gPT0gSEhJX1JBSU4KcmFpbl9tZW51IDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIk1BSU4gTUVOVSAtICIsbG9nSW5mbykpCnJhaW5fbWVudSA8LSBmaWx0ZXIocmFpbl9tZW51LCAhZ3JlcGwoIkxJVkVTVE9DSyBNQUlOIE1FTlUiLGxvZ0luZm8pKQpyYWluX21lbnUgPC0gZmlsdGVyKHJhaW5fbWVudSwgIWdyZXBsKCJISEkgTUFJTiBNRU5VIixsb2dJbmZvKSkKcmFpbl9tZW51IDwtIGZpbHRlcihyYWluX21lbnUsICFncmVwbCgiQ09WSUQtMTkgTUFJTiBNRU5VIixsb2dJbmZvKSkKCiNncm91cGluZyB0aGUgb2JzZXJ2YXRpb25zCnJhaW5fbWVudSA8LXJhaW5fbWVudSAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgpyYWluX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHJhaW5fbWVudSRsb2dJbmZvLCAiTUFJTiBNRU5VIC0gIiwgIiIpCnJhaW5fbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51JGxvZ0luZm8sICIgU0VMRUNURUQiLCAiIikKcmFpbl9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShyYWluX21lbnUkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCnJhaW5fbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UocmFpbl9tZW51JGxvZ0luZm8sICIgT1BUSU9OIiwgIiIpCgojcGxvdHRpbmcgcmFpbiBtZW51IGJyZWFrZG93bgpnZ3Bsb3QoZGF0YT1yYWluX21lbnUsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPTEpKSsKICBnZW9tX2JhcihmaWxsPSdibHVlJykrCiAgbGFicygKICAgIHRpdGxlID0gJ0JyZWFrZG93biBmb3IgSW5kaXZpZHVhbHMgQnkgQ29udGVudCBTZWxlY3RlZCBhdCBsZWFzdCBPbmNlIGZyb20gdGhlIHJhaW4gbWVudScsCiAgICB4ID0gJ0NvbnRlbnQgU2VsZWN0ZWQnLAogICAgeT0gJ2NvdW50JwogICkKCgoKYGBgCgoKCioqV2UgY2FuIHNlZSB0aGF0IHRoZSBwcmUtcGxhbnRpbmcgbWVudSwgd2hpY2ggc3RpbGwgaGFzIG92ZXIgNzUlIG9mIHVuaXF1ZSB1c2VycyBhY2Nlc3NzIGl0IGF0IGxlYXN0IG9uY2UgZXhwZXJlaW5jZXMgaW5jcmVkaWJseSBoaWdoIHVzYWdlLiBTbywgd2Ugbm93IGRpdmUgaW50byB0aGlzIG1lbnUuIFdlIHdpbGwgYnJlYWtkb3duIGNvbmVudCBzZWxlY3Rpb24gYnkgbGFuZ3VhZ2UgYW5kIG92ZXJhbGwqKgoKCiMjIyBSQUlOIE1FTlUvUFJFIFBMQU5USU5HIE1FTlUKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gUkFORE9NIEVYUEVSSU1FTlQgLS0+IAojIyMjIyBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VIC0tPiBQUkUgUExBTlRJTkcgTUVOVQoKKipQbGVhc2Ugbm90ZSwgdGhlIHByZSBwbGFudGluZyBtZW51IHVuZGVyIHRoZSByYWluIG1lbnUgaXMgcmVmZXJyZWQgdG8gYXMgTUVOVSAxIGluIHRoZSBkYXRhKioKCgoqKlBSRSBQTEFOVElORyBNRU5VKioKCiAtIExBTkQgUFJFUEFSQVRJT04KIC0gU0VFRCBWQVJJRVRZCiAtIFJFUEVBVCBNRU5VCiAtIEdPIFRPIE1BSU4gTUVOVSAoUkFJTiBNRU5VKQogLSBJTlZBTElEIEtFWSAoQURESVRJT05BTCBPVVRDT01FKQogCiAKYGBge3J9CgoKI2ZpbHRlcmluZyBvdXQgTUVOVSAxIG9wdGlvbnMgYXMgdGhlIHByZSBwbGFudGluZwpNRU5VXzEgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiTUVOVSAxIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiSEhJTUVOVSAxIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiQVBJQ1VMVFVSRSBNRU5VIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiQVBJQ1VMVFVSRSBTVUI0IE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJEQUlSWSBNRU5VIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiU01BTEwtU0NBTEUgU1VCNSBNRU5VIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiREFJUlkgU1VCMiBNRU5VIixsb2dJbmZvKSkKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiRkFUVEVOSU5HIE1BTlUiLGxvZ0luZm8pKQoKTUVOVV8xIDwtIGZpbHRlcihNRU5VXzEsICFncmVwbCgiRkFUVEVOSU5HIFNVQjEgTUVOVSIsbG9nSW5mbykpCk1FTlVfMSA8LSBmaWx0ZXIoTUVOVV8xLCAhZ3JlcGwoIkZBVFRFTklORyBTVUIyIE1FTlUiLGxvZ0luZm8pKQpNRU5VXzEgPC0gZmlsdGVyKE1FTlVfMSwgIWdyZXBsKCJIT1VTRUhPTEQgTUVOVSIsbG9nSW5mbykpCk1FTlVfMSA8LSBmaWx0ZXIoTUVOVV8xLCAhZ3JlcGwoIkhPVVNFSE9MRCBTVUIxIE1FTlUgIixsb2dJbmZvKSkKCgpNRU5VXzEgPC0gTUVOVV8xICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsb2dJbmZvLCBsYW5nSWQpICU+JQogIGNvdW50KCkKCk1FTlVfMSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoTUVOVV8xJGxvZ0luZm8sICJNRU5VIDEgLSAiLCAiIikKTUVOVV8xJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzEkbG9nSW5mbywgIiBQUkVTU0VEIiwgIiIpCk1FTlVfMSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoTUVOVV8xJGxvZ0luZm8sICIgU0VMRUNURUQiLCAiIikKCiMgcGxvdHRpbmcKZ2dwbG90KGRhdGE9TUVOVV8xLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMjUsIGhqdXN0PSAxKSkrCiAgZ2VvbV9iYXIoZmlsbD0nY3lhbicpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdJbmRpdmlkdWFscyBCeSBDb250ZW50IFNlbGVjdGVkIGF0IGxlYXN0IE9uY2UgZnJvbSAKICAgIFJBSU4gTUVOVS9QUkUgUExBTlRJTkcgT1BUSU9OJywKICAgIHggPSAnQ29udGVudCBTZWxlY3RlZCcsCiAgICB5PSAnY291bnQnCiAgKQoKCgpgYGAKCgojIyMgUkFJTiBNRU5VL1BSRSBQTEFOVElORyBNRU5VL0xBTkQgUFJFUEFSQVRJT04KCgoqKldlIGNvbnRpbnVlIG91ciBwYXR0ZXJuIG9mIGZvbGxvd2luZyB0aGUgbW9zdCBhY2Nlc3NlZCBzdWJtZW51IGZyb20gdGhlIHByZXZpb3VzIHN1Ym1lbnQgLSBsYW5kIHByZXBhcmF0aW9uISBUaGlzIGlzIGFsc28gdGhlIGJvdHRvbSBvZiBhIHRyZWUuIFdlIHdpbGwgYnJlYWtkb3duIGNvbmVudCBzZWxlY3Rpb24gYnkgbGFuZ3VhZ2UgYW5kIG92ZXJhbGwqKgoKCiMjIyMjIElOQ09NSU5HIENBTEwgU1RBUlRFRCAtLT4gV0VMQ09NRSBNRVNTQUdFIFBMQVlFRCAtLT4gUkFORE9NIEVYUEVSSU1FTlQgLS0+IAojIyMjIyBUT1AgTUVOVSAtLT4gUkFJTiBNRU5VIC0tPiBQUkUgUExBTlRJTkcgTUVOVSAtLT4gTEFORCBQUkVQQVJBVElPTgoKKipMQU5EIFBSRVBBUkFUSU9OKioKCiAtIEJBUkxFWQogLSBNQUlaRQogLSBTT1JHSFVNCiAtIFRFRgogLSBXSEVBVAogLSBTRVNBTUUKIC0gRkFWQSBCRUFOCiAtIENISUNLUEVBCiAtIENPTU1PTiBCRUFOCiAtIENPVFRPTgoKT1JERVIgVU5LT1dOOgoKIC0gUklDRQogLSBEVVJBTUUgV0hFQVQKIC0gTEVOVElMCiAtIE1BTFQgQkFSTEVZCiAKIApgYGB7cn0KI0dFVFRJTkcgVEhFIENST1AgTUVOVSBGUk9NIE1FTlUgMSAocmFpbi9wcmVwbGFudGluZy9sYW5kIHByZXBhcmF0aW9uIHN1YiBtZW51KQpsYW5kX3ByZXAgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiQ09OVEVOVCBQTEFZRUQgLSBMQU5EIFBSRVBBUkFUSU9OIC0gIixsb2dJbmZvKSkKCmxhbmRfcHJlcF9maW5hbCA8LSBsYW5kX3ByZXAgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIGxvZ0luZm8sIGxhbmdJZCkgJT4lCiAgY291bnQoKQoKbGFuZF9wcmVwX2ZpbmFsJGxvZ0luZm88LSBzdHJfcmVwbGFjZShsYW5kX3ByZXBfZmluYWwkbG9nSW5mbywgIkNPTlRFTlQgUExBWUVEIC0gTEFORCBQUkVQQVJBVElPTiAtIiwgIiIpCgpnZ3Bsb3QoZGF0YT1sYW5kX3ByZXBfZmluYWwsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MikpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ1JBSU4gTUVOVS9QUkUgUExBTlRJTkcvTEFORCBQUkVQQVJBVElPTgogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQgYnkgbGFuZ3VhZ2UnLAogICAgeCA9ICdDb250ZW50IFBsYXllZCcsCiAgICB5PSAnY291bnQnCiAgKQoKCiNnZXQgcmlkIG9mIHRoZSBsYW5ndWFnZSBicmVha2Rvd24KbGFuZF9wcmVwX25vX2xhbmcgPC0gbGFuZF9wcmVwX2ZpbmFsCgpsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2UobGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbywgIi0gQU1IQVJJQyIsICIiKQpsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2UobGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbywgIi0gT1JPTUlGRkEiLCAiIikKbGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm8sICItIFRJR1JJR05BIiwgIiIpCmxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShsYW5kX3ByZXBfbm9fbGFuZyRsb2dJbmZvLCAiLSBXT0xBWUlUVEEiLCAiIikKbGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm8sICItIFdPTEFZVElHTkEiLCAiIikKbGFuZF9wcmVwX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGxhbmRfcHJlcF9ub19sYW5nJGxvZ0luZm8sICItIFNJREFNSUdOQSIsICIiKQoKZ2dwbG90KGxhbmRfcHJlcF9ub19sYW5nLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdSQUlOIE1FTlUvUFJFIFBMQU5USU5HL0xBTkQgUFJFUEFSQVRJT04KICAgIGNvbnRlbnQgcGxheWVkIG92ZXJhbGwnLAogICAgeCA9ICdDb250ZW50IFBsYXllZCcsCiAgICB5PSAnY291bnQnCiAgKQoKZ2dwbG90KGxhbmRfcHJlcF9ub19sYW5nLCBhZXMobGFuZ0lkLCBmaWxsID0gbG9nSW5mbykpICsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdBTFRFUk5BVElWRSBSQUlOIE1FTlUvUFJFIFBMQU5USU5HL0xBTkQgUFJFUEFSQVRJT04KICAgIGNvbnRlbnQgYWN0dWFsbHkgcGxheWVkIGJ5IGxhbmd1YWdlCiAgICAxID0gQW1oYXJpYywgMj1Pcm9taWZmYSwgMz1UaWdyaWduYSwgND1Xb2xheWl0dGEsIGFuZCA1PVNpZGFtaWduYQogICAgJywKICAgIHggPSAnTGFuZ3VhZ2UnCiAgKQpgYGAKIAoKKipCSUcgVEFLRUFXQVk6IDM1JSBvZiB1c2VycyBlbmQgdXAgYWNjZXNzaW5nIHRoZSBtYWl6ZSBtZW51IGF0IHNvbWUgcG9pbnQhIFdoZWF0LCBUZWYsIFNvcmdodW0sIGFuZCBCYXJsZXkgYWxzbyBhcHBlYXIgdG8gYmUgcXVhbGl0YXRpdmVseSBzaWduaWZpY2FudCoqCgoqKlRoZXJlIGlzIG5vIG1lbnUgdG8gZ28gZGVlcGVyIGluLCBzbyBsZXQncyBnbyBiYWNrIHVwIGEgbGV2ZWwgYW5kIGNoZWNrIHRvIHNlZSBpZiBvdGhlciBicmFuY2hlcyBoYXZlIGEgbG90IG9mIGFjY2VzcyoqCgoKIyMjIFJBSU4gTUVOVS9QUkUgUExBTlRJTkcgTUVOVS9TRUVEIFZBUklFVFkKCgojIyMjIyBJTkNPTUlORyBDQUxMIFNUQVJURUQgLS0+IFdFTENPTUUgTUVTU0FHRSBQTEFZRUQgLS0+IFJBTkRPTSBFWFBFUklNRU5UIC0tPiAKIyMjIyMgVE9QIE1FTlUgLS0+IFJBSU4gTUVOVSAtLT4gUFJFIFBMQU5USU5HIE1FTlUgLS0+IFNFRUQgVkFSSUVUWQoKKipTRUVEIFZBUklFVFkqKgoKIC0gQkFSTEVZCiAtIE1BSVpFCiAtIFNPUkdIVU0KIC0gVEVGCiAtIFdIRUFUCiAtIFNFU0FNRQogLSBGQVZBIEJFQU4KIC0gQ0hJQ0tQRUEKIC0gQ09NTU9OIEJFQU4KCmBgYHtyfQojR0VUVElORyBUSEUgQ1JPUCBNRU5VIEZST00gTUVOVSAxIChyYWluL3ByZXBsYW50aW5nL3NlZWQgdmFyaWV0eSBzdWIgbWVudSkKc2VlZF92YXJpZXR5IDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIkNPTlRFTlQgUExBWUVEIC0gU0VFRCBWQVJJVFkiLGxvZ0luZm8pKQoKc2VlZF92YXJpZXR5X2ZpbmFsIDwtIHNlZWRfdmFyaWV0eSAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgpzZWVkX3ZhcmlldHlfZmluYWwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfdmFyaWV0eV9maW5hbCRsb2dJbmZvLCAiQ09OVEVOVCBQTEFZRUQgLSBTRUVEIFZBUklUWSAtICIsICIiKQoKZ2dwbG90KGRhdGE9c2VlZF92YXJpZXR5X2ZpbmFsLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdSQUlOIE1FTlUvUFJFIFBMQU5USU5HL1NFRUQgVkFSSUVUWQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQgYnkgbGFuZ3VhZ2UnLAogICAgeCA9ICdDb250ZW50IFNlbGVjdGVkJywKICAgIHk9ICdjb3VudCcKICApCgoKI2dldCByaWQgb2YgdGhlIGxhbmd1YWdlIGJyZWFrZG93bgpzZWVkX3ZhcmlldHlfbm9fbGFuZyA8LSBzZWVkX3ZhcmlldHlfZmluYWwKCnNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvLCAiLSBBTUhBUklDIiwgIiIpCnNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvLCAiLSBPUk9NSUZGQSIsICIiKQpzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbywgIi0gVElHUklHTkEiLCAiIikKc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfdmFyaWV0eV9ub19sYW5nJGxvZ0luZm8sICItIFdPTEFZSVRUQSIsICIiKQpzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbywgIi0gV09MQVlUSUdOQSIsICIiKQpzZWVkX3ZhcmlldHlfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF92YXJpZXR5X25vX2xhbmckbG9nSW5mbywgIi0gU0lEQU1JR05BIiwgIiIpCgojYWx0ZXJuYXRpdmUgd2l0aCBsYW5nYXVnZSB2aWV3CmdncGxvdChzZWVkX3ZhcmlldHlfbm9fbGFuZywgYWVzKGxhbmdJZCwgZmlsbCA9IGxvZ0luZm8pKSArCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQUxURVJOQVRJVkUgUkFJTiBNRU5VL1BSRSBQTEFOVElORy9TRUUgVkFSSUVUWQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQgYnkgbGFuZ3VhZ2UKICAgIDEgPSBBbWhhcmljLCAyPU9yb21pZmZhLCAzPVRpZ3JpZ25hLCA0PVdvbGF5aXR0YSwgYW5kIDU9U2lkYW1pZ25hCiAgICAnLAogICAgeCA9ICdMYW5ndWFnZScKICApCgojbm8gbGFuZ3VhZ2UgLSBvdmVyYWxsCmdncGxvdChzZWVkX3ZhcmlldHlfbm9fbGFuZywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdD0xKSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnUkFJTiBNRU5VL1BSRSBQTEFOVElORy9zZWVkIHZhcmlldHkKICAgIGNvbnRlbnQgYWN0dWFsbHkgcGxheWVkJywKICAgIHggPSAnQ29udGVudCBTZWxlY3RlZCcsCiAgICB5PSAnY291bnQnCiAgKQoKCmBgYAogCioqV2UgaGF2ZSBtb3N0bHkgZXhoYXVzdGVkIHRoZSBwcmUtcGxhbnRpbmcgb3B0aW9uIG1lbnUsIGFuZCBpZiB3ZSBnbyBiYWNrIHVwIHRvIHRoZSBvcmlnaW5hbCByYWluIG1lbnUgKGFrYSBNQUlOIE1FTlUpLCB3ZSBjYW4gc2VlIHRoYXQgcGxhbnRpbmcgYWxzbyBoYXMgYSBsYXJnZSBwb3Jwb3J0aW9uIG9mIHVzZXJzIC0gb3ZlciBoYWxmKioKCgojIyMgUkFJTiBNRU5VL1BMQU5USU5HIE1FTlUKCgojIyMjIyBJTkNPTUlORyBDQUxMIFNUQVJURUQgLS0+IFdFTENPTUUgTUVTU0FHRSBQTEFZRUQgLS0+IFJBTkRPTSBFWFBFUklNRU5UIC0tPiAKIyMjIyMgVE9QIE1FTlUgLS0+IFJBSU4gTUVOVSAtLT4gUExBTlRJTkcgTUVOVQoKKipUaGUgcGxhbnRpbmcgb3B0aW9uIGFzIGEgc3Vic2VjdGlvbiBvZiB0aGUgcmFpbiBvcHRpb24gaXMga25vd24gYXMgTUVOVSAyIGluIHRoZSBkYXRhKioKClBMQU5USU5HIE1FTlUKCiAtIFNFRUQgUkFURQogLSBTT0lMIERFUFRIIFBMQU5USU5HCiAtIFRSQU5TUExBTlRJTkcKIC0gTU9JU1RVUkUgQ09OU0VSVkFUSU9OCiAtIEZFUlRJTElaRVIgQVBQTElDQVRJT04KIC0gUkVQTEFZIE1FTlkKIC0gUkVUVVJOIFRPIFJBSU4gTUVOWQogLSBJTlZBTElEIEtFWSAoQURESVRJT05BTCBPVVRDT01FKQogCgoKYGBge3J9CiNQTEFOVElORyBPUFRJT04gLSBzZWNvbmQgbW9zdCBhY2Nlc3NlZCBNRU5VIDIKTUVOVV8yIDwtIGZpbHRlcihsb2dfZGF0YSwgZ3JlcGwoIk1FTlUgMiIsbG9nSW5mbykpCk1FTlVfMiA8LSBmaWx0ZXIoTUVOVV8yLCAhZ3JlcGwoIkhISU1FTlUgMiIsbG9nSW5mbykpCk1FTlVfMiA8LSBmaWx0ZXIoTUVOVV8yLCAhZ3JlcGwoIkFQSUNVTFRVUkUgTUVOVSIsbG9nSW5mbykpCk1FTlVfMiA8LSBmaWx0ZXIoTUVOVV8yLCAhZ3JlcGwoIkFQSUNVTFRVUkUgU1VCMiBNRU5VIixsb2dJbmZvKSkKTUVOVV8yIDwtIGZpbHRlcihNRU5VXzIsICFncmVwbCgiREFJUlkgTUVOVSIsbG9nSW5mbykpCk1FTlVfMiA8LSBmaWx0ZXIoTUVOVV8yLCAhZ3JlcGwoIkZBVFRFTklORyBNQU5VIixsb2dJbmZvKSkKCk1FTlVfMiA8LSBNRU5VXzIgJT4lCiAgZ3JvdXBfYnkoY2FsbGVySWQsIGxvZ0luZm8sIGxhbmdJZCkgJT4lCiAgY291bnQoKQoKI2NsZWFuaW5nCk1FTlVfMiRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoTUVOVV8yJGxvZ0luZm8sICJNRU5VIDIgLSAiLCAiIikKTUVOVV8yJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzIkbG9nSW5mbywgIiBTRUxFQ1RFRCIsICIiKQpNRU5VXzIkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKE1FTlVfMiRsb2dJbmZvLCAiIFBSRVNTRUQiLCAiIikKTUVOVV8yJGxvZ0luZm88LSBzdHJfcmVwbGFjZShNRU5VXzIkbG9nSW5mbywgIiBPUFRJT04iLCAiIikKCgojcGxvdHRpbmcKZ2dwbG90KGRhdGE9TUVOVV8yLCBhZXMoeD1mY3RfaW5mcmVxKGxvZ0luZm8pKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEpKSsKICBnZW9tX2JhcihmaWxsPSdvbGl2ZWRyYWInKSsKICBsYWJzKAogICAgdGl0bGUgPSAnSW5kaXZpZHVhbHMgQnkgQ29udGVudCBTZWxlY3RlZCBhdCBsZWFzdCBPbmNlIGZyb20gCiAgICBSQUlOIE1FTlUvUExBTlRJTkcgT1BUSU9OJywKICAgIHggPSAnQ29udGVudCBTZWxlY3RlZCcsCiAgICB5PSAnY291bnQnCiAgKQpgYGAKCgoKKipBcyBwZXIgdXN1YWwsIHdlIHdpbGwgZ28gaW50byB0aGUgbW9zdCBjb21tb24gc2VsZWN0aW9uOiBzZWVkIHJhdGUhKioKCiMjIyBSQUlOIE1FTlUvUExBTlRJTkcgTUVOVS9TRUVEIFJBVEUKCgojIyMjIyBJTkNPTUlORyBDQUxMIFNUQVJURUQgLS0+IFdFTENPTUUgTUVTU0FHRSBQTEFZRUQgLS0+IFJBTkRPTSBFWFBFUklNRU5UIC0tPiAKIyMjIyMgVE9QIE1FTlUgLS0+IFJBSU4gTUVOVSAtLT4gUExBTlRJTkcgTUVOVSAtLT4gU0VFRCBSQVRFCgoKKipTRUVEIFJBVEUqKgoKIC0gQkFSTEVZCiAtIE1BSVpFCiAtIFNPUkdIVU0KIC0gVEVGCiAtIFdIRUFUCiAtIFNFU0FNRQogLSBGQVZBIEJFQU4KIC0gQ0hJQ0tQRUEKIC0gQ09NTU9OIEJFQU4KIC0gQ09UVE9OCgpPUkRFUiBVTktPV046CgogLSBSSUNFCiAtIERVUkFNRSBXSEVBVAogLSBMRU5USUwKIC0gTUFMVCBCQVJMRVkKCmBgYHtyfQpzZWVkX3JhdGUgPC0gZmlsdGVyKGxvZ19kYXRhLCBncmVwbCgiQ09OVEVOVCBQTEFZRUQgLSBTRUVEIFJBVEUiLGxvZ0luZm8pKQoKc2VlZF9yYXRlX2ZpbmFsIDwtIHNlZWRfcmF0ZSAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgpzZWVkX3JhdGVfZmluYWwkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfcmF0ZV9maW5hbCRsb2dJbmZvLCAiQ09OVEVOVCBQTEFZRUQgLSBTRUVEIFJBVEUgLSIsICIiKQoKZ2dwbG90KGRhdGE9c2VlZF9yYXRlX2ZpbmFsLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsaGp1c3Q9MSkpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ1JBSU4gTUVOVS9QTEFOVElORy9TRUVEIFJBVEUKICAgIGNvbnRlbnQgYWN0dWFsbHkgcGxheWVkIGJ5IGxhbmd1YWdlJywKICAgIHggPSAnQ29udGVudCBTZWxlY3RlZCcsCiAgICB5PSAnY291bnQnCiAgKQoKI2dldCByaWQgb2YgdGhlIGxhbmd1YWdlIGJyZWFrZG93bgpzZWVkX3JhdGVfbm9fbGFuZyA8LSBzZWVkX3JhdGVfZmluYWwKCnNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvLCAiLSBBTUhBUklDIiwgIiIpCnNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm88LSBzdHJfcmVwbGFjZShzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvLCAiLSBPUk9NSUZGQSIsICIiKQpzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbywgIi0gVElHUklHTkEiLCAiIikKc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbzwtIHN0cl9yZXBsYWNlKHNlZWRfcmF0ZV9ub19sYW5nJGxvZ0luZm8sICItIFdPTEFZSVRUQSIsICIiKQpzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbywgIi0gV09MQVlUSUdOQSIsICIiKQpzZWVkX3JhdGVfbm9fbGFuZyRsb2dJbmZvPC0gc3RyX3JlcGxhY2Uoc2VlZF9yYXRlX25vX2xhbmckbG9nSW5mbywgIi0gU0lEQU1JR05BIiwgIiIpCgojYWx0ZXJuYXRpdmUgd2l0aCBsYW5nYXVnZSB2aWV3CmdncGxvdChzZWVkX3JhdGVfbm9fbGFuZywgYWVzKGxhbmdJZCwgZmlsbCA9IGxvZ0luZm8pKSArCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQUxURVJOQVRJVkUgUkFJTiBNRU5VL1BMQU5USU5HL1NFRUQgUkFURQogICAgY29udGVudCBhY3R1YWxseSBwbGF5ZWQgYnkgbGFuZ3VhZ2UKICAgIDEgPSBBbWhhcmljLCAyPU9yb21pZmZhLCAzPVRpZ3JpZ25hLCA0PVdvbGF5aXR0YSwgYW5kIDU9U2lkYW1pZ25hCiAgICAnLAogICAgeCA9ICdMYW5ndWFnZScKICApCiNubyBsYW5ndWFnZQpnZ3Bsb3Qoc2VlZF9yYXRlX25vX2xhbmcsIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSkpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ1JBSU4gTUVOVS9QTEFOVElORy9TRUVEIFJBVEUKICAgIGNvbnRlbnQgYWN0dWFsbHkgcGxheWVkJywKICAgIHggPSAnQ29udGVudCBTZWxlY3RlZCcsCiAgICB5PSAnY291bnQnCiAgKQoKYGBgCgoKCgpgYGB7cn0KY3JvcF9tZW51IDwtIGxvZ19kYXRhICU+JQogIGZpbHRlcihncmVwbCgiQ1JPUCBNRU5VIC0gIixsb2dJbmZvKSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiSEhJIixsb2dJbmZvKSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiUkVQTEFZRUQiLGxvZ0luZm8pKQoKY3JvcF9tZW51IDwtIGNyb3BfbWVudSAlPiUKICBncm91cF9ieShjYWxsZXJJZCwgbG9nSW5mbywgbGFuZ0lkKSAlPiUKICBjb3VudCgpCgpjcm9wX21lbnUkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNyb3BfbWVudSRsb2dJbmZvLCAiQ1JPUCBNRU5VIC0gIiwgIiIpCmNyb3BfbWVudSRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY3JvcF9tZW51JGxvZ0luZm8sICIgU0VMRUNURUQiLCAiIikKY3JvcF9tZW51JGxvZ0luZm88LSBzdHJfcmVwbGFjZShjcm9wX21lbnUkbG9nSW5mbywgIkdPIFRPIiwgIiIpCgoKZ2dwbG90KGNyb3BfbWVudSwgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duJywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKCmdncGxvdChjcm9wX21lbnUsIGFlcyhsYW5nSWQsIGZpbGwgPSBsb2dJbmZvKSkgKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0NST1AgTUVOVSBCWSBMQU5HVUFHRQogICAgMSA9IEFtaGFyaWMsIDI9T3JvbWlmZmEsIDM9VGlncmlnbmEsIDQ9V29sYXlpdHRhLCBhbmQgNT1TaWRhbWlnbmEKICAgICcsCiAgICB4ID0gJ0xhbmd1YWdlJwogICkKbnVtX2Nyb3BfdHlwZXMgPC0gZGF0YS5mcmFtZShhcy5udW1lcmljKHRhYmxlKGNyb3BfbWVudSRjYWxsZXJJZCkpKQpudW1fY3JvcF90eXBlcyRmcmVxdWVuY2llcyA8LSBudW1fY3JvcF90eXBlcyRhcy5udW1lcmljLnRhYmxlLmNyb3BfbWVudS5jYWxsZXJJZC4KCnN1bW1hcnkobnVtX2Nyb3BfdHlwZXMkZnJlcXVlbmNpZXMpCgpnZ3Bsb3QobnVtX2Nyb3BfdHlwZXMsIGFlcyhmcmVxdWVuY2llcykpICsKICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPSJyZWQiKSArCiAgbGFicygKICAgIHRpdGxlID0gJ0Rpc3RyaWJ1dGlvbiBvZiBudW1iZXIgY3JvcHMgZXZlciBzZWxlY3RlZCBieSBpbmRpdmlkdWFsIFxuCiAgICAgIE1pbi4gIDFzdCBRdS4gIE1lZGlhbiAgICBNZWFuICAgM3JkIFF1LiAgICBNYXguIAogIDEuMDAwICAgICAyLjAwMCAgICAgNC4wMDAgICAgICA0LjkxNSAgICAgNy4wMDAgICAgIDE1LjAwMCAnLAogICAgeCA9ICdOdW1iZXIgb2YgY3JvcHMgc2VsZWN0ZWQgJwogICkKYGBgCgoKI1doYXQgYWJvdXQgYSBuaWNlIGNyb3AgYnJlYWtkb3duIHBlciBtb250aD8KYGBge3J9Cgpjcm9wX21vbnRoIDwtIGxvZ19kYXRhICU+JQogIGZpbHRlcihncmVwbCgiQ1JPUCBNRU5VIC0gIixsb2dJbmZvKSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiSEhJIixsb2dJbmZvKSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiUkVQTEFZRUQiLGxvZ0luZm8pKQoKY3JvcF9tb250aCA8LSBjcm9wX21vbnRoICU+JQogIGdyb3VwX2J5KGNhbGxlcklkLCBsb2dJbmZvLG1vbnRoKSAlPiUKICBjb3VudCgpCgpjcm9wX21vbnRoJGxvZ0luZm88LSBzdHJfcmVwbGFjZShjcm9wX21vbnRoJGxvZ0luZm8sICJDUk9QIE1FTlUgLSAiLCAiIikKY3JvcF9tb250aCRsb2dJbmZvPC0gc3RyX3JlcGxhY2UoY3JvcF9tb250aCRsb2dJbmZvLCAiIFNFTEVDVEVEIiwgIiIpCmNyb3BfbW9udGgkbG9nSW5mbzwtIHN0cl9yZXBsYWNlKGNyb3BfbW9udGgkbG9nSW5mbywgIkdPIFRPIiwgIiIpCgoKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSAxKQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIEphbicsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCiAgCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gMikKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBmZWInLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQpjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDMpCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24gbWFyJywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSA0KQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIGFwcmlsJywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSA1KQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIG1heScsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gNikKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBqdW5lJywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSA3KQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIGp1bHknLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQpjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDgpCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24gYXVnJywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSA5KQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIHNlcCcsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCmNyb3BfdHJhY2sgPC0gY3JvcF9tb250aCAlPiUKICBmaWx0ZXIobW9udGggPT0gMTApCmdncGxvdChjcm9wX3RyYWNrLCBhZXMoeD1sb2dJbmZvKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0xLCBzaXplID0gNykpKwogIGdlb21fYmFyKCkrCiAgbGFicygKICAgIHRpdGxlID0gJ0Nyb3AgbWVudSBicmVha2Rvd24gb2N0JywKICAgIHggPSAnQ3JvcHMnLAogICAgeT0gJ2NvdW50JwogICkKY3JvcF90cmFjayA8LSBjcm9wX21vbnRoICU+JQogIGZpbHRlcihtb250aCA9PSAxMSkKZ2dwbG90KGNyb3BfdHJhY2ssIGFlcyh4PWxvZ0luZm8pKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPTEsIHNpemUgPSA3KSkrCiAgZ2VvbV9iYXIoKSsKICBsYWJzKAogICAgdGl0bGUgPSAnQ3JvcCBtZW51IGJyZWFrZG93biBub3YnLAogICAgeCA9ICdDcm9wcycsCiAgICB5PSAnY291bnQnCiAgKQpjcm9wX3RyYWNrIDwtIGNyb3BfbW9udGggJT4lCiAgZmlsdGVyKG1vbnRoID09IDEyKQpnZ3Bsb3QoY3JvcF90cmFjaywgYWVzKHg9bG9nSW5mbykpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9MSwgc2l6ZSA9IDcpKSsKICBnZW9tX2JhcigpKwogIGxhYnMoCiAgICB0aXRsZSA9ICdDcm9wIG1lbnUgYnJlYWtkb3duIGRlYycsCiAgICB4ID0gJ0Nyb3BzJywKICAgIHk9ICdjb3VudCcKICApCgoKYGBgCgo=